package thread;

import org.omg.CORBA.Object;

/**
 * 同步块
 * 有效的缩小同步范围可以在保证并发安全的前提下尽可能的提高并发效率
 * <p>
 * 语法
 * synchronized(同步监视器对象){
 * 需要多线程同步执行的代码片段
 * }
 */
public class SyncDemo2 {
    public static void main(String[] args) {
        shop shop = new shop();
        Thread t1 = new Thread("张三") {
            @Override
            public void run() {
                shop.buy();
            }
        };
        Thread t2 = new Thread("李四") {
            @Override
            public void run() {
                shop.buy();
            }
        };
        t1.start();
        t2.start();
    }
}

class shop {
    /*
    在成员方法上使用synchronized,那么同步监视器对象就是该方法所属对象
    即;this
     */
    //public synchronized void buy(){
    public void buy() {
        Thread t = Thread.currentThread();
        try {
            System.out.println(t.getName() + ":正在挑衣服....");
            Thread.sleep(5000);
            /*
                同步块可以更灵活更准确的锁定需要排队的代码片段
                使用听不需要制定同步监视器对象,它可以使java中任何引用类型的实例
                只要保证多个需要排队执行该代码块的线程看到的这个对象是同一个即可
             */
            // (new Object()) 没有效果
            synchronized (this){
            System.out.println(t.getName() + ":正在试衣服...");
            Thread.sleep(5000);}

            System.out.println(t.getName() + ":结账离开");
        } catch (InterruptedException e) {

        }
    }
}